Debuggers are used in both development and field environments to determine if program code is operating properly, and to investigate faults that cause improper program behavior that is apparent, such as non-terminating behavior. Debuggers generally provide views of the various aspects of internal program function and structure, such as traces of program execution path and views of program variables, in addition to hardware observation capabilities such as register and memory value snooping.
In a remote debugging situation, typically, when a program executed in a data processing system (e.g., an appliance system deployed at a client site) detects a predefined event, such as a page fault failure, a memory snapshot is captured and stored in a file, referred to as a core dump file. The core dump file is then transmitted to a remote system (e.g., a centralized management system) over a network for further offline analysis.
In software, a core dump (memory dump) is to preserve a task statistics and data when it encounters a fatal error. Once the memory has been written to disks as a core dump file in the binary format, programmers later use the core dump file with its binary object in order to triage the fatal error. However, this process does not scale well if the dump-able memory size is huge. It is not only consuming a long time to write all the memory into disks, transferring the core file over the network is even taking 10×-50× more time for such a big file (e.g., in a gigabyte (GB) range), which requires a significant higher bandwidth or resources. Sometimes needing a core file for the error triage is misleading. If all the needed information can be presented to programmers in a concise format, this can help to root cause the fatal error without needing the core file.